package com.hc.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hc.constant.CategoryStatusConst;
import com.hc.domain.Category;
import com.hc.dto.CategoryDTO;
import com.hc.dto.ListCategoryDTO;
import com.hc.vo.CategorySortVO;
import com.hc.vo.CategoryVO;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 类别映射
 *
 * @author 梁云亮
 */
@Mapper
public interface CategoryMapper extends BaseMapper<Category> {

    /**
     * 查询指定名称的博客类别在数据库中的数量
     * 添加类别时使用，因为数据库表中类别名称不允许重复
     *
     * @param name
     * @return
     */
    @Select("SELECT count(*) FROM tb_category WHERE name = #{name} ")
    int selectCategoryAmountByName(@Param("name") String name);

    /**
     * 查询指定id的博客类别的信息
     *
     * @param id
     * @return
     */
    @Select("SELECT id,name,img,intro FROM tb_category WHERE id = #{id} ")
    CategoryDTO selectedCategoryById(@Param("id") Integer id);

    /**
     * 获取指定用户的处于不同状态的博客类别的列表信息
     *
     * @param userId 用户编号
     * @param status 博客状态：1已经通过审核、2未通过审核、3已经删除
     * @return
     */
    @Select("SELECT id,name,img FROM tb_category WHERE status=#{status}  AND user_id = #{userId} ORDER BY id DESC")
    List<ListCategoryDTO> selectCategoryDTOsByUserId(@Param("userId") Integer userId, @Param("status") Integer status);

    /**
     * 添加一个类别
     * 添加Category时，新增加主键的level值默认为0
     *
     * @param categoryVO:name+img+intro+userId
     * @return
     */
    @Insert("INSERT INTO tb_category (name,img,intro,level,status,user_id,create_time) VALUES (#{categoryVO.name},#{categoryVO.img},#{categoryVO.intro} ,0 ," + CategoryStatusConst.UNCHECKED + ",#{categoryVO.userId},now())")
    int insertCategory(@Param("categoryVO") CategoryVO categoryVO);

    /**
     * 更新指定id的博客类别的状态
     *
     * @param id
     * @param status
     * @return
     */
    @Update("UPDATE tb_category SET status= #{status} WHERE id= #{id} ")
    int updateCategoryStatus(@Param("id") Integer id, @Param("status") Integer status);

    /**
     * 更新类别排序
     *
     * @param categorySortVO
     * @return
     */
    @Update("UPDATE tb_category SET level=#{categorySortVO.level}  WHERE id=#{categorySortVO.id} ")
    int updateCategoryLevel(@Param("categorySortVO") CategorySortVO categorySortVO);

    /**
     * 批量更新指定博客类别的Level，排序博客类别时用
     *
     * @param categorySortVOList
     * @return
     */
    int updateCategoriesLevel(@Param("categorySortVOList") List<CategorySortVO> categorySortVOList);

    /**
     * 根据 id 修改博客类别
     *
     * @param id
     * @param categoryVO
     * @return
     */
    int updateCategorySelective(@Param("id") Integer id, @Param("categoryVO") CategoryVO categoryVO);

    /**
     * 彻底删除指定编号的博客分类
     *
     * @param id
     * @return
     */
    @Delete("DELETE FROM tb_category WHERE id=#{id} ")
    int deleteCategoryById(@Param("id") Integer id);
}
